class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        // 利用滑动窗口，同向双指针
        int len = 0, sum = 0;
        int n = nums.size();
        stack<int> min;     // 这个栈用来存放比长度len小的
        min.push(n);        // 先把数组长度放进去
        int* minArr = new int[n]; // 这个是存储最小数组的

        for (int left = 0, right = 0; left < n && right < n; )
        {
            for (int k = left; k <= right && k < n; k++)
            {
                sum += nums[k];
                if (sum < target && k == right) // 满足这个条件right++
                {
                    right++;
                }

                if (sum >= target)
                {
                    len = right - left + 1; // 更新长度

                    if(len == 1)    // 长度为1就是最小的，直接返回
                        return 1;
                    
                    if (min.top() > len)
                    {
                        min.push(len);  // 小的就进栈
                        for (int m = left, l = 0; m <= right && l < len; m++, l++)
                        {
                            minArr[l] = nums[m];   // 把数放进minArr
                        }
                    }

                    left++;
                    k = left - 1;   // 更新一下k，防止k多加了一次，所以要碱1
                    sum = 0;    // 更新一下sum
                }
            }
        }
        delete[] minArr;

        if(len == 0)    // 长度0，就返回0
            return 0;
        else
            return min.top();
    }
};

/**************************************************************/
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size(), sum = 0, len = INT_MAX;
        for(int left = 0, right = 0; right < n; right++)
        {
            sum += nums[right];     // 进窗口
            while(sum >= target)    // 判断
            {
                len = min(len, right - left + 1);   // 更新一下len
                sum -= nums[left++];// 出窗口
            }
        }

        return len == INT_MAX ? 0 : len;
    }
};